package com.scub.foundation.tutorial.spring.mvc.controller;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.scub.foundation.tutorial.spring.mvc.model.MessagePersonneModel;
import com.scub.foundation.tutorial.spring.mvc.validator.MessagePersonneValidator;

/**
 * @author Scub-Foundation
 */
@Controller
public class IndexController {

    /** Nom du model */
    private String commandName;
    
    /** Vue à afficher lorsque le formulaire est correctement rempli */
    private String successView;
    
    /** Vue contenant le formulaire */
    private String formView;

    /** Initialisation du validateur */
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new MessagePersonneValidator());
    }

    /**
     * Initialisation de la page de formulaire
     * @param model modele de la page
     * @return le nom de la page à afficher 
     */
    @RequestMapping(value = "form.mvc")
    public String initAccueil(final Model model) {
        MessagePersonneModel messagePersonneModel = new MessagePersonneModel();

        model.addAttribute(commandName, messagePersonneModel);
        return formView;
    }

    /**
     * Réception du résultat du formulaire
     * @param model modele de la page
     * @param messagePersonneModel Modele retourné par le formulaire
     * @param result Résultat du validateur
     * @return le nom de la page à afficher
     */
    @RequestMapping(value = "form.mvc", method = RequestMethod.POST)
    public String getInfoAccueil(final Model model, @Valid MessagePersonneModel messagePersonneModel, BindingResult result) {
        // S'il y a des erreurs, on reste sur le formulaire
        if (result.hasErrors())
            return formView;
        // Sinon, on passe à la page d'affichage des informations
        else {
            model.addAttribute("messagePersonneModel", messagePersonneModel);
            return successView;
        }

    }

    /** Setter sur le nom du modèle */
    public void setCommandName(String commandName) {
        this.commandName = commandName;
    }

    /** Setter du nom de la successView */
    public void setSuccessView(String successView) {
        this.successView = successView;
    }

    /** Setter du nom de la formView */
    public void setFormView(String formView) {
        this.formView = formView;
    }

    
}
